package ar.edu.utn.frgp.banco.servlets.cuentas;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.domain.enums.TipoCuenta;
import ar.edu.utn.frgp.banco.exceptions.PersonalisedException;
import ar.edu.utn.frgp.banco.servlets.SuperServlet;
import ar.edu.utn.frgp.banco.utils.Constantes;
import ar.edu.utn.frgp.banco.utils.RequestConverterUtils;

/**
 * Servlet implementation class CrearCuenta
 */
public class CuentasServlet extends SuperServlet implements Servlet {

	private static final long serialVersionUID = -5339203022620635105L;
	
	private Cuenta cuenta;
	private final static String NOMBRE_VARIABLE_CUENTA = "cuenta"; 
	
	
    /**
     * Default constructor. 
     */
    public CuentasServlet() {
    	super();
    }

	@Override
	public String execute(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException, Exception{
		
		return inicioCrear(req, resp);
	}
	
	
	public String inicioCrear(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException, Exception {
		
		try {
			recargarCuentas();
		} catch (PersonalisedException e) {
			addError(e.getError());
			return "/app/welcome.jsp";
		}
		
		Cuenta cuenta = new Cuenta();
		
		if (clienteActivo.getCuentasCorrientes() == null || clienteActivo.getCuentasCorrientes().size() < TipoCuenta.CUENTA_CORRIENTE.getMaximo()){
			cuenta.setTipoCuenta(TipoCuenta.CUENTA_CORRIENTE);
		} else {
			if (clienteActivo.getCajaAhorro() == null){
				cuenta.setTipoCuenta(TipoCuenta.CAJA_AHORROS);
			} else {
				addAdvertencia("No puede crear mas cuentas.");
				return "app/welcome.jsp";
			}
		}
		
		req.setAttribute(NOMBRE_VARIABLE_CUENTA, cuenta);
					
		return Constantes.PAGINA_CREAR_CUENTA;
		
	}
	
	public String crearCuenta(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException, Exception {
		
		Cuenta cta = null;
		try{
			cta = cuentasService.crearCuenta(cuenta, clienteActivo.getDni());
			recargarCuentas();
		} catch (PersonalisedException e){
			addError(e.getError());
		}
		
		if (cta != null){
			req.setAttribute(NOMBRE_VARIABLE_CUENTA, cta);
			return Constantes.PAGINA_CREAR_CUENTA_OK;
		} else {
			req.setAttribute(NOMBRE_VARIABLE_CUENTA, cuenta);
			return Constantes.PAGINA_CREAR_CUENTA;
		}
				
		
	}
	
	public String movimientoCuenta(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException, Exception{
		//TODO aca hay que cargar la lista de cuentas para que la jsp pueda completar el combo.

		return Constantes.PAGINA_MOVIMIENTO_CUENTA;
			
		}
	public String consultarMovimientos(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException, IOException, Exception{
		
			//Movimientos mov = new Movimientos();
			cuenta = this.cuentasService.obtenerCuentaCompleta(cuenta.getNumero());
			
			req.setAttribute("cuenta", cuenta);
			return Constantes.PAGINA_MOVIMIENTO_CUENTA;
			
	}

	@Override
	public boolean populate(HttpServletRequest req){
		boolean devolver = true;
		cuenta = new Cuenta();
		
		
		if (req.getParameter("numeroCuenta") != null){
			cuenta.setNumero(Long.valueOf(req.getParameter("numeroCuenta")));
		}
		
		if (req.getParameter("saldo") != null){
		
			if (RequestConverterUtils.canConvertBigDecimal(req, "saldo")){
				cuenta.setSaldo(RequestConverterUtils.convertBigDecimal(req, "saldo"));
			} else {
				addAdvertencia("El formato del campo saldo no es el adecuando.");
				devolver = false;
			}
		}
		
		String desc = req.getParameter("descubierto");
		
		if (desc == null || "".equals(desc)){
			cuenta.setDescubierto(0);
		} else {
			if(RequestConverterUtils.canConvertBigDecimal(req, "descubierto")){
				cuenta.setDescubierto(RequestConverterUtils.convertBigDecimal(req, "descubierto"));
			} else {
				addAdvertencia("El formato del campo \"Descubierto\" no es valido.");
				cuenta.setDescubierto(0);
			}
		}
		
		String tipoCuenta = req.getParameter("tipoCuenta");
		
		if (tipoCuenta != null){
			cuenta.setTipoCuenta(tipoCuenta);
		}
		
		return devolver;
	}
	
	
	
	
}
